import java.util.*; // 导入Java的集合框架（如Map, Set, List等）

public class FSMNode { // 定义有限状态机节点类
    private int id; // 节点唯一标识符，用于区分不同的节点
    private TokenCode state; // 节点的状态，用TokenCode枚举表示当前状态
    private boolean isEndState; // 标识该节点是否为终止状态，终止状态指的是在该节点结束时FSM会停止
    private Map<Set<Character>, ArrayList<FSMNode>> transitions; // 转移表，用于存储不同输入字符集合对应的转移节点

    // 构造函数，初始化FSM节点的属性
    public FSMNode(int id, TokenCode state, boolean isEndState) {
        this.id = id; // 设置节点的唯一标识符
        this.state = state; // 设置节点的状态
        this.isEndState = isEndState; // 设置是否为终止状态
        this.transitions = new HashMap<>(); // 初始化转移表
    }

    public int getId() { // 获取节点的唯一标识符
        return id;
    }

    public TokenCode getState() { // 获取节点的状态
        return state;
    }

    public boolean isEndState() { // 判断该节点是否为终止状态
        return isEndState;
    }

    public void setEndState(boolean isEndState) { // 设置该节点是否为终止状态
        this.isEndState = isEndState;
    }

    public Map<Set<Character>, ArrayList<FSMNode>> getTrans() { // 获取该节点的转移表
        return transitions;
    }

    // 向转移表中添加一个新的转移
    public void addTransition(Set<Character> input, FSMNode target) {
        // 如果转移表中没有当前输入字符集，则会创建一个新的列表
        transitions.computeIfAbsent(input, k -> new ArrayList<>()).add(target);
    }
}